package com.piece.core.framework.util.file;

import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.Version;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.Locale;

/**
 * Freemarker转换类
 */
public class FreemarkerUtil {

    public static Configuration getConfiguration() {
        Configuration configuration = new Configuration(new Version("2.3.30"));
        configuration.setEncoding(Locale.CHINA, StandardCharsets.UTF_8.name());
        return configuration;
    }

    /**
     * 获取Freemarker模板文件
     *
     * @param templatePath
     * @param templateName
     * @return
     * @throws
     */
    public static Template getTemplate(String templatePath, String templateName) throws IOException {
        Configuration configuration = new Configuration(new Version("2.3.30"));
        configuration.setEncoding(Locale.CHINA, StandardCharsets.UTF_8.name());
        configuration.setClassForTemplateLoading(FreemarkerUtil.class, templatePath);
        return configuration.getTemplate(templateName);
    }

    /**
     * 生成word文件流
     *
     * @param templatePath ftl模板文件的路径（不含文件名）
     * @param templateName ftl模板文件的名称（不含路径）
     * @param data
     * @param os
     * @throws
     */
    public static void generateWordByFreemarker(String templatePath, String templateName, Object data, OutputStream os) throws Exception {
        Template template = getTemplate(templatePath, templateName);
        // 生成Word文档
        Writer w = new OutputStreamWriter(os);
        template.process(data, w);
        w.close();
    }

    /**
     * 生成html文件
     *
     * @param templatePath ftl模板文件的路径（不含文件名）
     * @param templateName ftl模板文件的名称（不含路径）
     * @param data
     * @throws
     */
    public static String generateHtmlByFreemarker(String templatePath, String templateName, Object data) throws Exception {
        Template template = getTemplate(templatePath, templateName);
        // 生成Html文档
        StringWriter w = new StringWriter();
        template.process(data, w);
        w.flush();
        return w.toString();
    }
}
